package com.cy.servideImpl;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import com.cy.VO.ImageVO;
import com.cy.dao.Picturedao;
import com.cy.pojo.Picturepojo;
import com.cy.service.ImageService;
import com.cy.utrl.*;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class ImageServiceImpl implements ImageService {

	/**
	 * 关于图片路径的说明:
	 * 1.本地磁盘路径
	 * 		E:\JT_IMAGE\2020\04\13\3b47781f2ce04b10aa64c997ec3efdc8.jpg
	 * 2.虚拟路径
	 * 		http://image.jt.com\2020\04\13\3b47781f2ce04b10aa64c997ec3efdc8.jpg
	 * 		
	 */
	
	
	//为了以后代码解耦,应该将配置文件写入properties文件中
	//@Value("${image.localDir}")
	private String localDir	 = "D:/image/";	//定义根目录
	//@Value("${image.url}")
	private String url="http://localhost:8090/image/";			//定义虚拟路径的根目录
	
	/**
	 * 文件上传步骤:
	 * 	1.校验上传的问题是否为图片    xx.jpg
	 * 	2.判断上传的文件是否为恶意程序(木马)
	 * 	3.需要分目录保存  控制目录中文件的个数
	 * 	4.防止文件重名. UUID动态生成文件名
	 * 
	 */
	@Autowired
	Picturedao picturedao;
	
	
	
	@Override
	public ImageVO upload(MultipartFile uploadFile,HttpServletRequest request) {
		//1.图片类型的校验 jpg|png|gif.....  盗版windows 
		String fileName = uploadFile.getOriginalFilename();
		fileName = fileName.toLowerCase();	//将字符转化为小写
		//正则表达式  任意字母,至少有一个.至少满足jpg,png,gif中的一个
		if(!fileName.matches("^.+\\.(jpg|png|gif)$")) {
			return ImageVO.fail();	//返回提交失败信息.
		}
		
		//2.判断文件是否为恶意程序  图片模版  获取宽度/高度
		try {
			BufferedImage bufferedImage = ImageIO.read(uploadFile.getInputStream());
			int width  = bufferedImage.getWidth();
			int height = bufferedImage.getHeight();
			
			if(width==0 || height==0) {
				return ImageVO.fail();
			}
			//项目部署的绝对路径
//			File path = ResourceUtils.getFile("classpath:image");
			//3.分目录存储设计  1.按照图片类型存储 2.按照hash方式存储  3.按照日期存储 yyyy/MM/dd
			String datePath = new SimpleDateFormat("yyyy/MM/dd/").format(new Date());
			//动态生成文件目录 E:/JT_IMAGE/2020/4/13/
			String fileDir =localDir + datePath;
			File imageFile = new File(fileDir);
			if(!imageFile.exists()) {
				imageFile.mkdirs();//创建多级目录.
			}
			
			//4.动态生成文件名称
			String uuid = UUID.randomUUID().toString().replace("-","");
			//获取原始文件的后缀    a.jpg
			int index = fileName.lastIndexOf(".");
			String fileType = fileName.substring(index);
			String realFileName = uuid + fileType;
			
			//指定文件真实地址   E:/JT_IMAGE/2020/4/13/abc.jpg
			String realFilePath = fileDir + realFileName;
			System.out.println("--------------"+realFilePath+"--------------");
			//实现文件上传
			uploadFile.transferTo(new File(realFilePath));
			
			//了解图片的虚拟路径     存入数据库中**********************
			// 路径为realFilePath
			//从request中解析前台pid数据
			
			
			String ypid=request.getParameter("pid");
			String yid=request.getParameter("yid");
			String link=null;
			if (request.getParameter("link")!=null) {
				link=request.getParameter("link");
			}
			
			String pid = IdCompos.IdZidCompos(yid,ypid);
			
			//需要构造类
			
			Picturepojo picpojo=new Picturepojo(pid,null,realFilePath,null,link);
			
			//探针判断 数据库数据pid的图片 是否存在
			//存储 updata传入数据库
			//不存在 创建pid数据
			
			if(DBDetector.DBDetector(pid)) {
				picturedao.updatepic(picpojo);
			}else {
				picturedao.insertpic(picpojo);
			}
			
			
			//http://image.jt.com\2020\04\13\ uuid.jpg  
			String realUrl = url + datePath + realFileName;
			
			return ImageVO.success(realUrl, width, height);
			
			
		} catch (IOException e) {
			
			e.printStackTrace();
			return ImageVO.fail();
		}
	}

}
